# -*- coding: utf-8 -*-
# @Time    : 2022/5/19 0:32
# @Author  : wise-wjw
# @File    : MoviesCategoriesAssociationRules.py
# @Software: PyCharm

"""对电影演员数据集进行关联规则挖掘，找出电影类别之间的关联关系。"""

import pandas as pd
from work10.Apriori import apriori

# 设置列对齐
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
# 强制显示所有属性值
pd.set_option('display.max_columns', None)

# TODO:1.设置最小支持度计数和最小置信度
min_sup = 0.001 * 131262  # 即最小支持度计数为131.262，已知项数为131262
min_conf = 0.6
# 最大K项集
K = 5

# TODO:2.读入文件，并查看数据信息
# 文件路径
file_path = r'resources/movies.csv'  # r对路径进行转义，windows需要
# 读取文件，并以DataFrame格式存储
moviesDf = pd.read_csv(file_path)   # 分隔符为','
# 维度与行数
print("数据集的维度与行数:", moviesDf.shape)
moviesDf_row_num, moviesDf_col_num = moviesDf.shape
print("movies dataset has {0} rows and {1} cols!\n".format(moviesDf_row_num, moviesDf_col_num))
# 查看moviesDf前五行数据
print(moviesDf.head(), "\n")

# TODO:3.数据预处理，提取有用的信息，并将数据格式转换成Apriori函数的输入数据格式
# 截取电影类别信息
movies_categories_relation_list = list(moviesDf['genres'])  # 将DataFrame转换为列表，['类别1|类别2|类别3|类别4', '类别3|类别2|类别4', ... ]
movies_categories_relation_set = []  # 电影类别列表（每个元素即一本书的合著作者列表）
# 将电影类别列表中的电影类别单个用列表表示（即将字符串转换为列表）
for x in movies_categories_relation_list:
    item = x.split('|')  # 以'|'为分隔符，切分列表，结果为['类别1', '类别2', '类别3', '类别4']
    movies_categories_relation_set.append(item)  # 将每个电影类别列表添加到总的电影类别列表中
print("总的电影类别列表:\n", movies_categories_relation_set, "\n")

# TODO:4.调用Apriori算法，输出挖掘的频繁项集和强关联规则
apriori(movies_categories_relation_set, min_sup, min_conf, K)


